package com.example.algorithm.LRU;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * ListHashMap本身实现了LRU算法
 * Created by ZMJ on 2020/1/10.
 * LRU 内存淘宝算法: 淘汰最近最少使用的元素
 */
public class LRUByListHashMap {

    public static void main(String args[]) {

        // 设置容量为2, 当内部元素超过2个的时候, 最近最少使用的被淘汰.
        LRUCache<Integer, Integer> cache = new LRUCache(2);
        cache.put(0, 0);
        cache.put(1, 1);
        cache.put(2, 2);
        cache.put(3, 3);
        cache.get(1);
        cache.get(2);

        for (Map.Entry<Integer, Integer> entry : cache.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
        // 淘汰最近最少使用的元素
        // 结果:
        // 3:3
        // 2:2

        // 淘汰的是 1:1 3:3
    }

}


/**
 * 创建缓存容器
 * @param <K>
 * @param <V>
 */
class LRUCache<K,V> extends LinkedHashMap<K, V> {

    // 定义容器长度
    private final int cacheSize;

    // 定义构造方法
    // 这里就是传递进来最多能缓存多少数据
    public LRUCache(int cacheSize) {
        super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
        this.cacheSize = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
        // 这个意思就是说当map中的数据量大于指定的缓存个数的时候，就自动删除最老的数据
        return size() > cacheSize;
    }


}